<?php

namespace Common\Model;

use Think\Model;

/**
 * 文档模型
 */
class DocModel extends Model {

    const NORMAL = 0;   // 文档状态：正常
    const DELTEL = -1;  // 文档状态：删除（冻结）
    const HIDDEN = 1;   // 文档状态：隐藏

    const CAN_EDIT = 0;         // 普通用户可编辑
    const CANNOT_EDIT = -1;     // 普通用户不可编辑

    const NEED_REVIEW = 0;      // 管理员提交需要审核
    const NEEDNOT_REVIEW = -1;  // 管理员提交不需审核

    const DOC_KEY = 'doc:';     // 文档信息缓存键名

    /**
     * 新增一条文档数据
     * @param $data
     * @return mixed
     */
    public static function addData($data){
        return M('Doc')->add($data);
    }

    /**
     * 更新文档信息
     * @param $did
     * @param $data
     * @return bool
     */
    public static function update($did, $data){
        if($result = M('Doc')->where(['id' => $did])->save($data)){
            self::clearCache($did);
        }
        return $result;
    }

    /**
     * 根据文档ID获取文档全部信息
     * @param $did
     * @param bool $add
     * @return mixed
     */
    public static function getDocById($did, $add = true){
        if (!$did) return null;
        $key = self::DOC_KEY.$did;
        $result = S($key);
        if (!$result && $result = M('Doc')->find($did)) {
            S($key, $result);
        }
        if ($result && $add && $addData = DocCountModel::get($did)) {
            foreach ($addData as $k => $v) {
                $result[$k] += $v;
            }
        }
        return $result;
    }

    /**
     * 创建私人文档
     * @param $uid
     * @param $gx
     * @param $data
     * @return bool|mixed
     */
    public static function createPrivateDoc($uid, $gx, $data){
        $model = M();
        $model->startTrans();
        // 先减少用户的贡献度
        if(!UserModel::updateGx($uid, $gx, false)){
            $model->rollback();
            return false;
        }
        // 然后添加文档信息
        $did = self::addData($data);
        if(!$did){
            $model->rollback();
            return false;
        }
        // 再生成二维码上传到七牛云服务器
        $url = 'http://doc.wooo.wang/show/'.$did;
        $file = 'static/tmp/'.time().'.png';
        getPng($url, $file, 'L', 3);
        $qrcodePath = 'qr/'.$did.'_'.time().'.png';
        if(updateQiniu($file, $qrcodePath)){
            if(!self::update($did, ['qr' => $qrcodePath])){
                $model->rollback();
                return false;
            }
            unlink($file);
        }
        if (!LogModel::userCreatePDoc($uid, $gx, $did)) {
            $model->rollback();
            return false;
        }
        $model->commit();
        // 清理用户私有文档缓存
        UserPDocModel::clearCache(UID);
        return $did;
    }

    /**
     * 社区创建一份公共文档
     * @param $bid
     * @param $gx
     * @param $data
     * @return bool|mixed
     */
    public static function createPublicDoc($bid, $gx, $data){
        $model = M();
        $model->startTrans();
        // 先减少团体的贡献度
        if(!BbsModel::updateGx($bid, $gx, false)){
            $model->rollback();
            return false;
        }
        // 然后添加文档信息
        $did = self::addData($data);
        if(!$did){
            $model->rollback();
            return false;
        }
        // 再生成二维码上传到七牛云服务器
        $url = 'http://doc.wooo.wang/show/'.$did;
        $file = 'static/tmp/'.time().'.png';
        getPng($url, $file, 'L', 3);
        $qrcodePath = 'qr/'.$did.'_'.time().'.png';
        if(updateQiniu($file, $qrcodePath)){
            if(!self::update($did, ['qr' => $qrcodePath])){
                $model->rollback();
                return false;
            }
            unlink($file);
        }
        if (!LogModel::bbsCreateDoc($bid, $data['uid'], $gx, $did)) {
            $model->rollback();
            return false;
        }
        $model->commit();
        // 清除团体文档缓存
        BbsDocModel::clearCache($bid);
        BbsCountModel::update($bid, 'docs');
        return $did;
    }

    /**
     * 修改文档状态
     * @param $doc
     * @param $status
     * @return bool
     */
    public static function updateStatus($doc, $status){
        if(self::update($doc['id'], ['status' => $status])){
            if ($doc['bid']) {
                BbsDocModel::clearCache($doc['bid']);
                BbsCountModel::update($doc['bid'], 'docs', false);
            } else {
                UserPDocModel::clearCache($doc['uid']);
            }
            DocModel::clearCache($doc['id']);
            return true;
        }
        return false;
    }

    /**
     * 恢复已经被冻结的文档
     * @param $doc
     * @param $gx
     * @return bool
     */
    public static function recoverDoc($doc, $gx){
        $model = M();
        $model->startTrans();
        // 先减少贡献度
        if ($doc['bid']) {
            $result = BbsModel::updateGx($doc['bid'], $gx, false);
        } else {
            $result = UserModel::updateGx($doc['uid'], $gx, false);
        }
        if(!$result){
            $model->rollback();
            return false;
        }
        // 再修改文档状态
        if(!self::updateStatus($doc, DocModel::NORMAL)){
            $model->rollback();
            return false;
        }
        $model->commit();
        if ($doc['bid']){
            BbsCountModel::update($doc['bid'], 'docs');
        }
        return true;
    }

    /**
     * 获取文档对应的名称
     * @param $did
     * @return mixed
     */
    public static function getDocName($did)
    {
        return self::getDocById($did, false)['name'];
    }

    public static function clearCache($did){
        $key = self::DOC_KEY.$did;
        S($key, null);
    }

}